package demo06;
/*
对象的上下转型
对象的向上转型(其实就是多态的写法)：父类名称 对象名 = new 子类名称();   Animal animal = new Cat();
含义：右侧创建了子类对象，把它当做父类来看待。                         创建了一只猫，当做动物来看待，没问题。
注意事项：向上转型一定是安全的。从小范围的猫，向上转换为更大类型的动物。

类似于：
double num =100;//正确，int ---->double，自动类型转换。
 */
/*
向上转型一定是安全的，没有问题的，正确的，但是也有一个弊端：对象一旦向上转型为父类，那么就无法调用子类特有的内容.
 解决方案：向下转型
 对象的向下转型，其实是一个[还原]的动作。
 格式：子类名称 对象名 =(子类名称) 父类对象；
 含义：将父类对象[还原]为本来的子类对象

 Animal animal =new Cat();//本来是猫，向上转型为动物
 Cat cat=(Cat) animal;//本来是猫，已经被当做动物了，还原为本来的猫
 注意事项：
 a.必须保证对象本来的创建的时候，就是猫，才能乡下转型为猫
 b.如果对象创建的时候本来不是猫，现在非要向下转型成为猫，将会报错。ClassCastException

 类似于int num=(int) 10.0;
      int num=(int) 10.5;//精度损失。
 */
public class Demo01Main {
    public static void main(String[] args) {
        //对象的向上转型，就是，父类引用指向之类对象
        Animal animal =new Cat();//本来创建的时候是一只猫
        animal.eat();

        //animal.catchMouse();//写法错误！
        //向下转型，进行还原动作
        Cat cat=(Cat) animal;
        cat.catchMouse();//猫抓老鼠

        //错误的向下转型
        //本来new的时候是一只猫，非要当成狗。
        Dog dog =(Dog) animal;//错误写法！编译不会出错，但是运行会出现异常

    }
}
